/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

import dbUtil.*;
import iteradores.*;
import beans.*;
import utils.MD5;
import utils.Iterador;

/**
 *
 * @author Administrador
 */
public class ManejadorAuditoria extends HttpServlet {

    private String nombreModulo = "auditoria";
    private IteradorUsuario usuarioActual;

    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("windows-1252");
        PrintWriter out = response.getWriter();
        String url = "";

        try {
            Connection con = null;
            //Obtiene la operación a realizar 
            String str_op = request.getParameter("op");

            //Datos del solicitudregistro actual de la sesion, si esto es nulo significa
            //que aun no hizo login
            usuarioActual = (IteradorUsuario) request.getSession().getAttribute("usuarioActual");

            if (usuarioActual == null) {
                url = "login.jsp"; //Volver a loguearse
            } else {
                // Obtiene la conexión a la base de datos de la sesión
                con = (Connection) request.getSession().getAttribute("ConexionBd");

                //Objeto que averigua si el solicitudregistro tiene permiso para acceder al servlet.
                PgAbm testPermiso = new PgAbm();
                testPermiso.setCon(con);

                usuarioActual.getReset();
                usuarioActual.getNext();

                if (testPermiso.tienePermiso(nombreModulo,
                        usuarioActual.getNombreusuario(),
                        str_op.substring(0, 6))) {

                    String action = request.getParameter("action");

                    action = action == null ? "" : action;

                    url = "auditoria.jsp?modo=SELECT";

                    if (str_op.equals("SELECT")) {
                        url = this.select_data(con, request, response, str_op);
                    }
                } else {
                    url = "sinpermiso.jsp";
                }
            }
            mostrar_pagina(url, request, response);
        } catch (Exception e) {
            e.printStackTrace(out);
        }

    }

    public void mostrar_pagina(String url, HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        RequestDispatcher disp = req.getRequestDispatcher(url);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setCharacterEncoding("windows-1252");
        resp.setHeader("Pragma", "no-cache");
        resp.setIntHeader("Expires", 0);
        disp.forward(req, resp);
    }

    public DBConfig getDataBaseConfig() {
        ServletContext scon = getServletContext();
        DBConfig dc = new DBConfig();
        dc.setDbname(scon.getInitParameter("dbname"));
        dc.setServer(scon.getInitParameter("dbserver"));
        dc.setUser(scon.getInitParameter("dbuser"));
        dc.setPass(scon.getInitParameter("dbpass"));
        return dc;
    }
//<editor-fold defaultstate="collapsed" desc="Métodos ABM (SELECT, INSERT, UPDATE y DELETE).">
    public String select_data(
            Connection con, HttpServletRequest request, HttpServletResponse response, String operacion) throws Exception {
        String url = "auditoria.jsp?modo=SELECT";
        String sql = "";
        Statement stm;
        Statement stm2;
        int tabla;
        String nombre = "";

        String tabla_ = request.getParameter("tabla");

        if (tabla_ != null && !tabla_.equalsIgnoreCase("")) {
            
            tabla = Integer.parseInt(tabla_);


            con.setAutoCommit(false);

            switch (tabla) {
                case 0:
                    //tabla auditoría de recurso
                    sql = "select case when tipooperacion = 'I' then 'Inserción' when tipooperacion = 'U' then 'Actualización' else 'Eliminación' end as operacion, " +
                            " au.fecha_ing as fechaingreso, idoperador as operadoringresante, idrecurso, au.descripcion, " +
                            " case when estado = 'F' then 'Funcionando' when estado = 'D' then 'Descompuesto' end as estado, " +
                            " au.idtiporecurso, tr.descripcion as tiporecurso " +
                            " from aud_recurso au" +
                            "	join tiporecurso tr on au.idtiporecurso = tr.idtiporecurso " +
                            " order by fechaingreso";
                    break;
                case 1:
                    //tabla auditoría de reserva
                    sql = "select case when tipooperacion = 'I' then 'Inserción' when tipooperacion = 'U' then 'Actualización' else 'Eliminación' end as operacion, " +
                            " au.fecha_ing as fechaingreso, au.usuario_ing as operadoringresante, idreserva, fechainicio, horainicio, fechafinal, horafinal, ubicacion, " +
                            " case when au.estado = 'A' then 'Activa' when au.estado = 'N' then 'Anulada' when au.estado = 'R' then 'Retirada' when au.estado = 'D' then 'Devuelta' end as estado, " +
                            " au.observacion, nombreretirante, au.idusuario as idsolicitante, sol.nombreoperativo as solicitante, au.idrecurso, r.descripcion as recurso, au.idtiporecurso, " +
                            " tp.descripcion as tiporecurso, idsolicitudreserva, idaprobador, apr.nombreoperativo as aprobador " +
                            " from aud_reserva au  " +
                            "	join usuario sol on au.idusuario = sol.idusuario " +
                            " join usuario apr on au.idusuario = apr.idusuario " +
                            "	join recurso r on au.idrecurso = r.idrecurso " +
                            "	join tiporecurso tp on au.idtiporecurso = tp.idtiporecurso " +
                            " order by fechaingreso";
                    break;
                case 2:
                    //tabla auditoría de solicitudregistro
                    sql = "select case when tipooperacion = 'I' then 'Inserción' when tipooperacion = 'U' then 'Actualización' else 'Eliminación' end as operacion, " +
                            " au.fecha_ing as fechaingreso, idoperador as operadoringresante, idsolicitudregistro, nombreusuario, nombre, apellido, nombreoperativo, " +
                            " direccion, telefono, telefonomovil, email, au.idtipodocumento, td.descripcion as tipodocumento, nrodocumento, observacion, " +
                            " case when estado = 'P' then 'Pendiente' when estado = 'A' then 'Aprobada' when estado = 'N' then 'Anulada' end as estado " +
                            " from aud_solicitudregistro au " +
                            "	join tipodocumento td on au.idtipodocumento = td.idtipodocumento " +
                            " order by fechaingreso";
                    break;
                case 3:
                    //tabla auditoría de solicitudreserva
                    sql = "select case when tipooperacion = 'I' then 'Inserción' when tipooperacion = 'U' then 'Actualización' else 'Eliminación' " +
                            " end as operacion, au.fecha_ing as fechaingreso, au.usuario_ing as operadoringresante, fechainicio, horainicio, fechafinal, " +
                            " horafinal, ubicacion, case when au.estado = 'A' then 'Activa' when au.estado = 'N' then 'Anulada' when au.estado = 'P' then 'Pendiente' end as estado, " +
                            " au.observacion, personaretiro as nombreretirante, au.idusuario as idsolicitante, sol.nombreoperativo as solicitante, au.idrecurso, r.descripcion as recurso, au.idtiporecurso, " +
                            " tp.descripcion as tiporecurso, idsolicitudreserva " +
                            " from aud_solicitudreserva  au " +
                            " join usuario sol on au.idusuario = sol.idusuario " +
                            " join recurso r on au.idrecurso = r.idrecurso " +
                            " join tiporecurso tp on au.idtiporecurso = tp.idtiporecurso " +
                            " order by fechaingreso";
                    break;
                case 4:
                    //tabla auditoría de usuario
                    sql = "select case when tipooperacion = 'I' then 'Inserción' " +
                            "when tipooperacion = 'U' then 'Actualización' " +
                            "else 'Eliminación' " +
                            "end as operacion, au.fecha_ing as fechaingreso, idoperador as operadoringresante, " +
                            "idusuario, nombre, apellido, nombreusuario, nombreoperativo, direccion, telefono, " +
                            "telefonomovil, email, observacion,au.idtipodocumento, " +
                            "td.descripcion as tipodocumento, nrodocumento " +
                            "from aud_usuario au" +
                            "	join tipodocumento td on au.idtipodocumento = td.idtipodocumento " +
                            " order by fechaingreso";
                    break;
                default:
                    break;
            }

            stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);

            System.out.println(sql);
            ResultSet result = stm.executeQuery(sql);

            Iterador it = null;

            switch (tabla) {
                case 0:
                    //tabla auditoría de recurso
                    it = new IteradorRecurso_aud(result);
                    nombre = "IteradorRecurso";
                    break;
                case 1:
                    //tabla auditoría de reserva
                    it = new IteradorReserva_aud(result);
                    nombre = "IteradorReserva";
                    break;
                case 2:
                    //tabla auditoría de solicitudregistro
                    it = new IteradorSolicitudRegistro_aud(result);
                    nombre = "IteradorSolicitudRegistro";
                    break;
                case 3:
                    //tabla auditoría de solicitudreserva
                    it = new IteradorSolicitudReserva_aud(result);
                    nombre = "IteradorSolicitudReserva";
                    break;
                case 4:
                    //tabla auditoría de usuario
                    it = new IteradorUsuario_aud(result);
                    nombre = "IteradorUsuario";
                    break;
                default:
                    break;
            }
            request.setAttribute(nombre, it);
            
            url += "&msg=SHOW";
        }
        
        return url;
    }

    public String update_data(
            Connection con, HttpServletRequest request, HttpServletResponse response, String operacion) throws Exception {
        String url = "retirodevolucion.jsp?modo=SELECT";
        String sql = "";
        Statement stm;

        String action = request.getParameter("action");
        String estado = operacion.equals("RETIRO") ? "Retiro" : "Devolución";
        String msg = operacion.equals("RETIRO") ? "R" : "D";

        if ((action != null) && action.equalsIgnoreCase("do")) {
            con.setAutoCommit(false);

            ResultSet rs_datos = null;

            try {
                CallableStatement proc = con.prepareCall("{? = call ins_evento ( " +
                        "?, ?, ? ) }",
                        ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

                proc.registerOutParameter(1, Types.OTHER);
                proc.setInt(2, request.getParameter("idreserva").equals("") ? null : Integer.parseInt(request.getParameter("idreserva")));
                proc.setString(3, estado.equals("") ? null : estado);
                proc.setString(4, msg.equals("") ? null : msg);


                proc.execute();

                rs_datos = (ResultSet) proc.getObject(1);

                int cant_filas = 0;
                if (rs_datos.last()) {
                    cant_filas = rs_datos.getRow();
                    rs_datos.beforeFirst();
                }

                this.select_data(con, request, response, operacion);

                con.commit();

                url = "retirodevolucion.jsp?modo=SELECT&msg=" + msg + "DONE";
            } catch (SQLException ex) {
                request.setAttribute("error", ex.getMessage());
                System.out.println(ex.getMessage());
                url = "retirodevolucion.jsp?modo=" + operacion + "&msg=ERROR";
                con.rollback();
                this.select_data(con, request, response, operacion);
            }

        } else {
            this.select_data(con, request, response, operacion);
        }

        return url;
    }
//</editor-fold>
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    public void destroy() {
    }

    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     */
    @Override
    public String getServletInfo() {
        return "Este servlet maneja las peticiones sobre la tabla SolicitudRegistro";
    }
// </editor-fold>
}
